package com.javafx.application;

import com.mxgraph.swing.mxGraphComponent;
import com.mxgraph.view.mxGraph;
import com.sun.javafx.cursor.CursorType;
import javafx.application.Application;
import javafx.embed.swing.SwingNode;
import javafx.event.EventHandler;
import javafx.geometry.Insets;
import javafx.scene.Cursor;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.control.Button;
import javafx.scene.control.Menu;
import javafx.scene.control.MenuBar;
import javafx.scene.control.MenuItem;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.*;
import javafx.scene.shape.Rectangle;
import javafx.stage.Stage;
import sun.plugin.dom.css.Rect;

import java.util.HashMap;
import java.util.Map;

/**
 * 题目：
 编写一个流程图的桌面应用。
 流程图（Flow Chart），顾名思义，就是用来直观地描述一个工作过程的具体步骤图，它使用图形表示流程思路，是一种极好的方法。
 界面中需有菜单栏、工具栏、图形库、图形编辑器，整体界面使用JavaFX框架开发，图形拖拽和图形库使用JGraphX来开发。
 界面设计可参考ProcessOn、	进行设计。
 开发环境：JDK8 + IDEA + JavaFX + JGraphX
 练习时间：一个星期，可按照进度适当延长时间。
 注：练习结束后，会针对此次练习做一个总结，到时会有代码评审并且需要展示练习结果。
 * @author 10550
 *
 */
public class Mian2 extends Application {

    //返回一个Map对象，当中包含了parent和graph
    protected static Map<String, Object> getGraphAndParent(){
        mxGraph graph = new mxGraph();
        Object parent = graph.getDefaultParent();
        graph.getModel().beginUpdate();
        Map<String,Object> map = new HashMap<String,Object>();
        map.put("graph",graph);
        map.put("parent",parent);
        return map;
    }

    //将Swing集成到Java FX中
    protected static SwingNode toJavaFx(mxGraph graph){
        mxGraphComponent compnent = new mxGraphComponent(graph);
        compnent.setDragEnabled(false);

        SwingNode node = new SwingNode();
        node.setContent(compnent);
        return node;
    }

    public void start(Stage stage) throws Exception {

        FlowPane root = new FlowPane();

        root.setHgap(10);
        root.setVgap(20);
        root.setPadding(new Insets(0,15,15,0));

        Scene scene = new Scene(root,900,900);
        scene.getStylesheets().add(getClass().getResource("/application.css").toExternalForm());
        // 创建一个菜单栏对象
        MenuBar menuBar = new MenuBar();
        // 将菜单栏的宽度与窗口的宽度进行绑定
        menuBar.prefWidthProperty().bind(stage.widthProperty());
        // 将菜单栏设置在顶部
        //root.setTop(menuBar);

        // 文件菜单选项
        Menu menu1 = new Menu("文件");
        // 文件菜单的子菜单
        MenuItem item1 = new MenuItem("打开");
        MenuItem item2 = new MenuItem("另存为");
        MenuItem item3 = new MenuItem("保存");

        menu1.getItems().addAll(item1, item2, item3);

        // 编辑菜单选项
        Menu menu2 = new Menu("编辑");
        // 文件菜单的子菜单
        MenuItem item4 = new MenuItem("撤销\t Ctrl+Z");
        MenuItem item5 = new MenuItem("恢复\t Ctrl+Y");
        MenuItem item6 = new MenuItem("复制\t Ctrl+C");
        MenuItem item7 = new MenuItem("粘贴\t Ctrl+V");

        menu2.getItems().addAll(item4, item5, item6, item7);

        // 将Menu对象添加到菜单栏
        menuBar.getMenus().addAll(menu1, menu2);

        root.getChildren().add(menuBar);

        //添加工具栏

        /*HBox b1 = new HBox();
        b1.prefWidthProperty().bind(stage.widthProperty());
        b1.setPrefHeight(50);
        b1.setStyle("-fx-background-color: #333;-fx-start-margin: 20;");
        root.setTop(b1);*/


        // 添加图形库,基础图形

        StackPane stackPane = new StackPane();

        //root.getChildren().add(stackPane);

       /* VBox vBox = new VBox();
        vBox.setId("vBox");
        VBox hBox = new VBox();

        hBox.setPrefWidth(400);*/


        Map<String, Object> graphAndParent = getGraphAndParent();
        mxGraph graph = (mxGraph)graphAndParent.get("graph");
        try{
            graph.insertVertex(graphAndParent.get("parent"),null,"Hello",0,0,40,40);
        }finally {
            graph.getModel().endUpdate();
        }
        SwingNode swingNode = toJavaFx(graph);

        stackPane.getChildren().add(swingNode);

        //root.getChildren().add(stackPane);


        // 添加图形库,流程图形
        VBox vBox1 = new VBox();
        vBox1.setId("vBox");
        HBox hBox1 = new HBox();
        Button btn5 = new Button("图形四");
        Button btn6 = new Button("图形五");
        Button btn7 = new Button("图形七");
        Button btn8 = new Button("图形八");
        hBox1.getChildren().addAll(btn5, btn6, btn7, btn8);
        vBox1.getChildren().add(hBox1);

        /*
         * 此处添加图形库
         */

        TitledPane title1 = new TitledPane("基础图形", stackPane);
        TitledPane title2 = new TitledPane("flowChart 流程图", vBox1);


        // 手风琴控件
        Accordion accordion = new Accordion();
        accordion.setId("accordion");

        accordion.getPanes().addAll(title1,title2);
        //root.setLeft(accordion);
        root.getChildren().add(accordion);

        //添加拖动窗口的区域
        VBox hBox2 = new VBox();
        hBox2.setId("b2");
       // root.setLeft(hBox2);
        root.getChildren().add(hBox2);

        //添加图形编辑区
        StackPane stackPane1 = new StackPane();
        stackPane1.setPrefSize(300,400);
        //stackPane.prefWidthProperty().bind(stage.widthProperty());
        stackPane1.setId("stack-pane");
        //设置边界可拖动
        stackPane1.setCursor(Cursor.MOVE);

        //root.setRight(stackPane1);

        //root.getChildren().add(node);

        stage.setScene(scene);
        stage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}
